package file;

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.util.*;

import javax.imageio.ImageIO;

public class FileChanger {
	
	public final static String EXTENTION_JPG = ".jpg";
	public final static String EXTENTION_HTML = ".html";
	public final static String EXTENTION_DAT = ".dat";
	
	
	/**画像表示用HTMLファイル生成メソッド
	 * 現在は戻り先が固定
	 * 対象フォルダの画像を並べる、次の画像へのリンク付き
	 * @param makefile		作成するファイル
	 * @param foldername	取得先のフォルダ
	 * @param filenames		取得先のフォルダの中に入っている画像の名前
	 * @throws IOException 
	 */
	public static void htmlmake(File makefile,String[] filenames) throws IOException{
		String fileName = makefile.getPath();
		PrintWriter pw = new PrintWriter(new BufferedWriter(
				new FileWriter(makefile)));//出力ファイル
		pw.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		pw.println("<HTML>");
		pw.println("<HEAD>");
		pw.println("<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">");
		String title = fileName.substring(fileName.lastIndexOf("/")+1,fileName.lastIndexOf("."));
		pw.println("<TITLE>"+title+"</TITLE>");
		pw.println("</HEAD>");
		pw.println("<BODY>");
		pw.println("<DIV align=\"right\">");
		pw.println("<A HREF=\"../index.html\"><B>戻る</B></A>");
		pw.println("</DIV>");
		pw.println("<HR>");
		pw.println("<TABLE BORDER=\"0\">");
		pw.println("\t<TBODY>");
		for(int i=0;i<filenames.length;i++){
			if(i%4==0){
				pw.println("\t\t<TR>");					
			}
			String jpgFilename = filenames[i].substring(filenames[i].lastIndexOf("\\")+1,filenames[i].lastIndexOf("."));
			String filepath = FileChanger.relative(filenames[i],fileName);
			String filetag = FileChanger.htmlTagSearch(FileChanger.wantWord(new File(filenames[i]), "IMG"), "IMG");
			int first = filetag.indexOf("\"", 0);
			int next = filetag.indexOf("\"",first+1);
			String imagepath = filetag.substring(first+1, next);
			pw.println("\t\t\t<TD>");
			pw.println("\t\t\t<FONT color=\"red\">"+jpgFilename+"</FONT><BR>");
			pw.println("\t\t\t<A HREF=\""+filepath+"\"><IMG src=\""
					+imagepath+"\" ALT=\""+jpgFilename+"\" width=\"200\" height=\"300\" ></A>");
			pw.println("\t\t\t</TD>");				
			if(i%4==3){
				pw.println("\t\t</TR>");
			}
		}
		if(filenames.length%4!=0){
			pw.println("\t\t</TR>");
		}
		pw.println("\t</TBODY>");
		pw.println("</TABLE>");
		pw.println("<DIV align=\"right\">");
		pw.println("<A HREF=\"index.html\"><B>戻る</B></A>");
		pw.println("</DIV>");
		pw.println("</BODY>");
		pw.println("</HTML>");
		pw.close();
	}
	
	/**HTMLファイル作成用メソッド
	 * フォルダの中にあるjpgファイルを表示するhtmlファイルを作成
	 * @param folder	フォルダパス
	 * @param make		これから作成するファイルパス、htmlファイル
	 * @throws IOException 
	 */
	public static void checkAndMake(String folder,String make) throws IOException{
		String[] filenames = 
			specificSort(fileNames(folder), EXTENTION_JPG);
		if(make.endsWith(EXTENTION_HTML)){
			File makefile = new File(make);
			if(!makefile.exists()){
				MakeListHtml(makefile, filenames);
			}else{
				System.out.println("すでに存在するファイルです");
			}
		}else{
			System.out.println("htmlファイルではありません");					
		}
	}
	
	/**画像表示用HTML生成メソッド
	 * 現在は戻り先が固定
	 * 対象フォルダの画像を並べる、次の画像へのリンク付き
	 * @param makefile　作成するファイル
	 * @param filenames　取得先のフォルダの中に入っている画像のパス
	 * @throws IOException 
	 */
	public static void MakeListHtml(File makefile,String[] filenames) throws IOException{
		String filename = makefile.getPath();
		PrintWriter pw = new PrintWriter(new BufferedWriter(
				new FileWriter(makefile)));//出力ファイル
		pw.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		pw.println("<HTML>");
		pw.println("<HEAD>");
		pw.println("<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">");
		String title = filename.substring(filename.lastIndexOf("/")+1,filename.lastIndexOf("."));
		pw.println("<TITLE>"+title+"</TITLE>");
		pw.println("</HEAD>");
		pw.println("<BODY>");
		pw.println("<DIV align=\"right\">");
		pw.println("<A HREF=\"index.html\"><B>戻る</B></A>");
		pw.println("</DIV>");
		pw.println("<HR>");
		for(int i=0;i<filenames.length-1;i++){
			pw.println("<A name=\"" +String.format("%03d",i+1)
					+"\" HREF=\"#"+String.format("%03d", i+2)+"\"><IMG src=\""
					+relative(filenames[i], filename)+"\""
					+" ALT=\""+String.format("%03d", i+1)+"\"></A><BR><HR>");
		}
		pw.println("<A name=\"" + String.format("%03d",filenames.length)
				+"\" HREF=\"index.html\"><IMG src=\""
				+relative(filenames[filenames.length-1], filename)+"\""
				+" ALT=\""+String.format("%03d", filenames.length)+"\"></A><BR><HR>");
		pw.println("<DIV align=\"right\">");
		pw.println("<A HREF=\"index.html\"><B>戻る</B></A>");
		pw.println("</DIV>");
		pw.println("</BODY>");
		pw.println("</HTML>");
		pw.close();
	}
	
	/**選別用メソッド
	 * Stringの配列から特定のワードを末尾に持つワードのみ抽出する
	 * @param array　探索する配列
	 * @param spec　探索するワード
	 * @return 探索するワードを末尾に持つ文字列の配列
	 */
	public static String[] specificSort(String[] array,String spec){
		int number = 0;
		for(int i=0;i<array.length;i++)if(array[i].endsWith(spec))number++;
		String[] specific = new String[number];
		number=0;
		for(int i=0;i<array.length;i++){
			if(array[i].endsWith(spec)){
				specific[number] = array[i];
				number++;
			}
		}
		return specific;
	}
	
	/**リネーム用メソッド
	 * 対象フォルダに存在する特定拡張子のファイルを名前順にソートし、001から順番にリネームする
	 * @param folder 探索するフォルダ
	 * @param extension　変更するファイルの拡張子、「.」から入力すること
	 */
	public static void nameChange(String folder,String extension){
		String[] filenames = fileNames(folder);
		String[] extfiles = specificSort(filenames, extension);
	    Arrays.sort(extfiles);
	    File[] newname = new File[extfiles.length];
	    for(int i=0;i<extfiles.length;i++){
	    	newname[i] = new File(
	    			folder.concat("/"+String.format("%03d",i+1).concat(extension)));
	    }
	    for(int i=0;i<extfiles.length;i++)new File(extfiles[i]).renameTo(newname[i]);

	}
	
	/**ファイル探索用メソッド
	 * そのフォルダに存在するファイルをArrayListで返す
	 * @param folder　フォルダのアドレス
	 * @return　File形式にしたフォルダ内のファイル
	 */
	public static ArrayList<File> SearchJpg(String folder){
		ArrayList<File> al = new ArrayList<File>();
		File dir = new File(folder);
		File[] file = dir.listFiles();
		for(int i=0;i<file.length;i++)al.add(file[i]);
		return al;
	}
	
	/**相対パス発見用メソッド
	 *ファイルパスからフォルダパスへの相対パスを作る
	 * @param file		探索開始地点のファイル
	 * @param folder	探索対象のフォルダ
	 * @return			ファイルからフォルダへの相対パス
	 */
	public static String relative(String file,String folder){
		int timing=0;
		file = file.replace('\\', '/');
		folder = folder.replace('\\', '/');
		while(true){
			if(file.charAt(timing) != folder.charAt(timing)){
				break;
			}
			timing++;
		}
		String exfolder = file.substring(file.lastIndexOf("/", timing+1)+1);
		String exfile = folder.substring(folder.lastIndexOf("/", timing+1)+1);
		int val = -1;
		int space = 0;
		while(space!=-1){
			space=exfile.indexOf("/",space+1);
			val++;
		}
		for(int i=0;i<val;i++)exfolder="../".concat(exfolder);
		return exfolder;
	}
		
	/**ファイル名の群から条件を判定する
	 * ファイルの長さがゼロの場合、特定の拡張子以外のファイルが含まれている場合アウト
	 * @param filename	ファイル群
	 * @param extention	含まれていなければならない拡張子
	 * @return		条件判定
	 */
	public static boolean foldercheck(String[] filename,String extention){
	    if(filename.length==0)return false;
	    for(int i=0;i<filename.length;i++){
	    	if(!filename[i].endsWith(extention))return false;
	    }
	    return true;
	}
	
	/**ファイル名探索メソッド
	 * 入力されたフォルダのパスから中にあるファイルの絶対パスの配列を返す
	 * @param folder	取り出し先のフォルダパス
	 * @return			フォルダ内のファイルのパスの配列
	 */
	public static String[] fileNames(String folder){
		File dir = new File(folder);
	    File[] files = dir.listFiles();
	    String[] filenames = new String[files.length];
	    for(int i=0;i<files.length;i++){
	    	filenames[i]=files[i].getPath();
	    }		
		return filenames;
	}
	
	/**行検索
	 * ファイルから特定のワードが出てくる最初の行を抜き出す
	 * @param file	探索するファイル
	 * @param word	探索するワード
	 * @return		探索するワードが出現する行
	 */
	public static String wantWord (File file,String word)throws IOException{
		try{
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
			while(true){
				String line = br.readLine();
				if(line==null)break;
				if(line.contains(word))return line;
			}
			br.close();
		}finally{
			
		}
		return null;
	}
	
	/**タグ検索
	 * 特定のStringから最初に出てくる特定のタグを抜き出す、閉じるタグは考慮しない
	 * @param line	探索するString
	 * @param tag	探索するタグ
	 * @return		出てきたタグ、なかった場合null
	 */
	public static String htmlTagSearch(String line,String tag){
		int search = -1;
		while(true){
			search = line.indexOf(tag, search+1);
			if(search==-1)break;
			int first = line.lastIndexOf("<", search);
			int firstcoron = line.lastIndexOf("\"", search);
			int firstunti = line.lastIndexOf(">", search);
			int end = line.indexOf(">", search);
			int endcoron = line.indexOf("\"", search);
			int endunti = line.indexOf("<", search);
			if( first != -1 && end != -1 && first > firstunti
					&& end < endunti && !( end > endcoron && first < firstcoron )){
				return line.substring(first, end+1);
			}
		}
		return null;
	}
	
	public static void main(String args[]) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String folder = br.readLine();
		String[] names = fileNames(folder);
		for(int i=0;i<names.length;i++)System.out.println(names[i]);
	}
}
